file_com.ml 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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. "Nice to meet you! Here some tips to get started with OcLaunch.\n\
  43. Use 'help' subcommand to get help (it works both after the name of the \
  44. software and with another subcommand). For instance run\n\
  45. `oclaunch help add`\n\
  46. For further help, see https://oclaunch.eu.org.\
  47. \n\
  48. \n\
  49. Feedback is welcome at feedback@oclaunch.eu.org.\n\
  50. To get remind for new stable versions, subscribe to our low-traffic mailing \
  51. list: announce@oclaunch.eu.org. \
  52. More here: https://lnch.ml/ml\n\
  53. See you soon! To keep in touch: https://lnch.ml/kit\n"
  54. ;;
  55. (* Function to write the rc file *)
  56. let write (rc_file:t) =
  57. (* Short name *)
  58. let name = !Const.rc_file in
  59. (* Create string to be written, after removing duplicated commands (and
  60. * newlines) *)
  61. let data = (Unify.prettify rc_file |> Settings_j.string_of_rc_file
  62. |> Yojson.Basic.prettify ~std:true) in
  63. Out_channel.write_all (Lazy.force name) ~data
  64. ;;
  65. (* Return the configuration file template *)
  66. let rc_template () =
  67. Settings_v.create_rc_file ~progs:[] ~settings:[]
  68. ;;
  69. (* Function to create configuration file if it does not
  70. * exist *)
  71. let create_rc_file ~name =
  72. (* Notify that we initialise config file *)
  73. sprintf "Initializing empty configuration file in %s." name |> Messages.warning;
  74. (* Final \n to display newline before showing the licence. *)
  75. Messages.tips welcome_msg;
  76. (* Display licence information *)
  77. Licencing.print ~cecill:false;
  78. let compact_rc_file = Settings_j.string_of_rc_file (rc_template () ()) in
  79. let readable_rc_file = Yojson.Basic.prettify compact_rc_file in (* Create human readable string for rc file *)
  80. let out_file = Out_channel.create name in
  81. Out_channel.output_string out_file readable_rc_file;
  82. Out_channel.close out_file
  83. ;;
  84. (* Function to read the rc file *)
  85. let rec init_rc ?(rc=(!Const.rc_file)) () =
  86. let rc' = Lazy.force rc in
  87. (* Verify that file exist *)
  88. match (Sys.file_exists rc') with
  89. | `No -> create_rc_file ~name:rc'; init_rc ~rc ();
  90. | `Unknown -> failwith "Error reading configuration file";
  91. | `Yes -> (* Try to read, if there is an error, reset file *)
  92. try
  93. In_channel.read_all rc' |> Settings_j.rc_file_of_string
  94. with
  95. | Yojson.Json_error _ -> (* Invalid file, delete, so that it will be reseted
  96. on next call *) Sys.remove rc'; init_rc ~rc ()
  97. ;;
  98. (* Get the command corresponding to a number *)
  99. let num_cmd2cmd ~rc n =
  100. List.nth rc.Settings_t.progs n
  101. ;;