file_com.ml 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. (******************************************************************************)
  2. (* Copyright © Joly Clément, 2014-2015 *)
  3. (* *)
  4. (* leowzukw@oclaunch.eu.org *)
  5. (* *)
  6. (* Ce logiciel est un programme informatique servant à exécuter *)
  7. (* automatiquement des programmes à l'ouverture du terminal. *)
  8. (* *)
  9. (* Ce logiciel est régi par la licence CeCILL soumise au droit français et *)
  10. (* respectant les principes de diffusion des logiciels libres. Vous pouvez *)
  11. (* utiliser, modifier et/ou redistribuer ce programme sous les conditions *)
  12. (* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA *)
  13. (* sur le site "http://www.cecill.info". *)
  14. (* *)
  15. (* En contrepartie de l'accessibilité au code source et des droits de copie, *)
  16. (* de modification et de redistribution accordés par cette licence, il n'est *)
  17. (* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, *)
  18. (* seule une responsabilité restreinte pèse sur l'auteur du programme, le *)
  19. (* titulaire des droits patrimoniaux et les concédants successifs. *)
  20. (* *)
  21. (* A cet égard l'attention de l'utilisateur est attirée sur les risques *)
  22. (* associés au chargement, à l'utilisation, à la modification et/ou au *)
  23. (* développement et à la reproduction du logiciel par l'utilisateur étant *)
  24. (* donné sa spécificité de logiciel libre, qui peut le rendre complexe à *)
  25. (* manipuler et qui le réserve donc à des développeurs et des professionnels *)
  26. (* avertis possédant des connaissances informatiques approfondies. Les *)
  27. (* utilisateurs sont donc invités à charger et tester l'adéquation du *)
  28. (* logiciel à leurs besoins dans des conditions permettant d'assurer la *)
  29. (* sécurité de leurs systèmes et ou de leurs données et, plus généralement, *)
  30. (* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. *)
  31. (* *)
  32. (* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez *)
  33. (* pris connaissance de la licence CeCILL, et que vous en avez accepté les *)
  34. (* termes. *)
  35. (******************************************************************************)
  36. open Core.Std;;
  37. (* Read settings and programs to launch from rc file *)
  38. (* Type of the values *)
  39. type t = Settings_v.rc_file;;
  40. (* Message to display on first use, i.e. on initialisation of rc file *)
  41. let welcome_msg =
  42. sprintf
  43. "Nice to meet you! Here is some tips to get started with OcLaunch.\n\
  44. Use 'help' subcommand to get help (it works both after the name of the \
  45. software and with another subcommand). For instance run\n\
  46. `oclaunch help add`\n\
  47. For further help, see https://oclaunch.eu.org. Report any bug at %s\
  48. \n\
  49. \n\
  50. Feedback is welcome at feedback@oclaunch.eu.org.\n\
  51. To get remind for new stable versions, subscribe to our low-traffic mailing \
  52. list: announce@oclaunch.eu.org. \
  53. More here: https://s.oclaunch.eu.org/ml\n\
  54. See you soon! To keep in touch: https://s.oclaunch.eu.org/kt\n"
  55. Bug.url
  56. ;;
  57. (* Function to write the rc file *)
  58. let write (rc_file:t) =
  59. (* Short name *)
  60. let name = !Const.rc_file in
  61. (* Create string to be written, after removing duplicated commands (and
  62. * newlines) *)
  63. let data = (rc_file |> Settings_j.string_of_rc_file
  64. |> Yojson.Basic.prettify ~std:true) in
  65. Out_channel.write_all (Lazy.force name) ~data
  66. ;;
  67. (* Return the configuration file template *)
  68. let rc_template () =
  69. Settings_v.create_rc_file ~progs:[] ~settings:[]
  70. ;;
  71. (* Function to create configuration file if it does not
  72. * exist *)
  73. let create_rc_file ~name =
  74. (* Notify that we initialise config file *)
  75. sprintf "Initializing empty configuration file in %s." name |> Messages.warning;
  76. (* Final \n to display newline before showing the licence. *)
  77. Messages.tips welcome_msg;
  78. (* Display licence information *)
  79. Licencing.print ~cecill:false;
  80. let compact_rc_file = Settings_j.string_of_rc_file (rc_template () ()) in
  81. let readable_rc_file = Yojson.Basic.prettify compact_rc_file in (* Create human readable string for rc file *)
  82. let out_file = Out_channel.create name in
  83. Out_channel.output_string out_file readable_rc_file;
  84. Out_channel.close out_file
  85. ;;
  86. (* Function to read the rc file *)
  87. let rec init_rc ?(rc=(!Const.rc_file)) () =
  88. let rc' = Lazy.force rc in
  89. (* Verify that file exist *)
  90. match (Sys.file_exists rc') with
  91. | `No -> create_rc_file ~name:rc'; init_rc ~rc ();
  92. | `Unknown -> failwith "Error reading configuration file";
  93. | `Yes -> (* Try to read, if there is an error, reset file *)
  94. try
  95. In_channel.read_all rc' |> Settings_j.rc_file_of_string
  96. with
  97. | Yojson.Json_error _ -> (* Invalid file, delete, so that it will be reseted
  98. on next call *) Sys.remove rc'; init_rc ~rc ()
  99. ;;
  100. (* Get the command corresponding to a number *)
  101. let num_cmd2cmd ~rc n =
  102. List.nth rc.Settings_t.progs n
  103. ;;