CachedPackage.vala 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. using Invercargill;
  2. namespace Usm {
  3. public class CachedPackage {
  4. public string state_path { get; private set; }
  5. public string package_path { get; private set; }
  6. public string package_name { get; private set; }
  7. public CachedPackage(string path) {
  8. this.state_path = path;
  9. this.package_path = Path.build_filename(path, "package.usmc");
  10. this.package_name = Path.get_basename(path);
  11. }
  12. public Manifest get_manifest() throws Error {
  13. return new Manifest.from_package(package_path);
  14. }
  15. public OriginInformation get_origin_information() throws Error {
  16. return new OriginInformation.from_file(Path.build_filename(state_path, "origin-info"));
  17. }
  18. public bool has_build_directory() {
  19. return File.new_for_path(build_directory_path()).query_exists();
  20. }
  21. public bool has_build_archive() {
  22. return File.new_for_path(build_archive_path()).query_exists();
  23. }
  24. public string create_build_directory() throws Error {
  25. var path = build_directory_path();
  26. var manifest = get_manifest();
  27. var file = File.new_for_path(path);
  28. if(manifest.flags.has(ManifestFlag.BUILD_IN_SOURCE_TREE)) {
  29. file.make_symbolic_link(source_directory_path());
  30. }
  31. else {
  32. File.new_for_path(path).make_directory();
  33. }
  34. return path;
  35. }
  36. public string get_build_directory() throws Error {
  37. var path = build_directory_path();
  38. if(File.new_for_path(path).query_exists()) {
  39. return path;
  40. }
  41. var archive_path = build_archive_path();
  42. if(!File.new_for_path(archive_path).query_exists()) {
  43. throw new StateError.NO_BUILD_ARTIFACT(@"The package \"$package_name\" has no build artifact");
  44. }
  45. Util.unarchive(archive_path, path);
  46. return path;
  47. }
  48. public string get_build_archive() throws Error {
  49. var path = build_archive_path();
  50. if(File.new_for_path(path).query_exists()) {
  51. return path;
  52. }
  53. var dir_path = build_directory_path();
  54. if(!File.new_for_path(dir_path).query_exists()) {
  55. throw new StateError.NO_BUILD_ARTIFACT(@"The package \"$package_name\" has no build artifact");
  56. }
  57. Util.archive(dir_path, path);
  58. return path;
  59. }
  60. public void archive_build() throws Error {
  61. var build_dir = get_build_directory();
  62. // Delete existing archive, if it exists
  63. var archive_file = File.new_for_path(build_archive_path());
  64. if(archive_file.query_exists()) {
  65. archive_file.delete();
  66. }
  67. Util.archive(build_dir, archive_file.get_path());
  68. clean_build_directory();
  69. }
  70. public void unarchive_build() throws Error {
  71. clean_build_directory();
  72. get_build_directory();
  73. }
  74. public void clean_build_directory() throws Error {
  75. var path = build_directory_path();
  76. if(File.new_for_path(path).query_exists()) {
  77. Util.delete_tree(path);
  78. }
  79. }
  80. public string get_source_directory() throws Error {
  81. var path = source_directory_path();
  82. if(File.new_for_path(path).query_exists()) {
  83. return path;
  84. }
  85. print(@"Extracting $(package_path) to $(path)\n");
  86. Util.unarchive(package_path, path);
  87. return path;
  88. }
  89. public void clean_source() throws Error {
  90. var path = source_directory_path();
  91. if(File.new_for_path(path).query_exists()) {
  92. Util.delete_tree(path);
  93. }
  94. }
  95. public string create_install_directory() throws Error {
  96. var path = install_directory_path();
  97. File.new_for_path(path).make_directory();
  98. return path;
  99. }
  100. public void clean_install() throws Error {
  101. var path = install_directory_path();
  102. if(File.new_for_path(path).query_exists()) {
  103. Util.delete_tree(path);
  104. }
  105. }
  106. public void update_origin_information(OriginInformation info) throws Error {
  107. var properties = OriginInformation.get_mapper().map_from(info);
  108. var json = new InvercargillJson.JsonElement.from_properties(properties);
  109. json.write_to_file(Path.build_filename(state_path, "origin-info"));
  110. }
  111. private string build_directory_path() {
  112. return Path.build_filename(state_path, "build");
  113. }
  114. private string build_archive_path() {
  115. return Path.build_filename(state_path, "build.tar.xz");
  116. }
  117. private string source_directory_path() {
  118. return Path.build_filename(state_path, "package");
  119. }
  120. private string install_directory_path() {
  121. return Path.build_filename(state_path, "install");
  122. }
  123. }
  124. public class CachedPackageManifest {
  125. public CachedPackage package { get; private set; }
  126. public Manifest manifest { get; private set; }
  127. public CachedPackageManifest(CachedPackage package) throws Error {
  128. this.package = package;
  129. this.manifest = package.get_manifest();
  130. }
  131. }
  132. }