annotate mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/HgRepo.java @ 645:4cf1ab3cd162

Merge in subrepos
author Dmitry Neverov <dmitry.neverov@jetbrains.com>
date Tue, 17 Sep 2013 18:48:51 +0400
parents d28d52336ce5
children 0b50d7952a7d
rev   line source
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
1 package jetbrains.buildServer.buildTriggers.vcs.mercurial;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
2
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
3 import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.*;
478
0a33f3dbd261 Ensure temp dirs are deleted
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 472
diff changeset
4 import jetbrains.buildServer.log.Loggers;
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
5 import jetbrains.buildServer.util.FileUtil;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
6 import jetbrains.buildServer.vcs.VcsException;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
7 import org.jetbrains.annotations.NotNull;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
8
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
9 import java.io.File;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
10 import java.io.IOException;
425
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
11 import java.util.*;
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
12
587
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 585
diff changeset
13 import static java.util.Arrays.asList;
511
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
14 import static java.util.Collections.emptyList;
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
15 import static java.util.Collections.emptyMap;
478
0a33f3dbd261 Ensure temp dirs are deleted
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 472
diff changeset
16 import static jetbrains.buildServer.buildTriggers.vcs.mercurial.HgFileUtil.deleteDir;
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
17 import static jetbrains.buildServer.util.FileUtil.isEmptyDir;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
18
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
19 /**
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
20 * @author dmitry.neverov
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
21 */
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
22 public class HgRepo {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
23
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
24 protected final CommandSettingsFactory myCommandSettingsFactory;
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
25 protected final File myWorkingDir;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
26 protected final String myHgPath;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
27 protected final AuthSettings myAuthSettings;
600
6c480513e5c2 Optimize subrepo changes calculation: reuse subrepo revision table calculated for parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 587
diff changeset
28 protected final Map<String, Map<String, SubRepo>> mySubreposCache = new HashMap<String, Map<String, SubRepo>>();
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
29
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
30 public HgRepo(@NotNull CommandSettingsFactory commandSettingsFactory,
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
31 @NotNull File workingDir,
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
32 @NotNull String hgPath,
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
33 @NotNull AuthSettings authSettings) {
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
34 myCommandSettingsFactory = commandSettingsFactory;
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
35 myWorkingDir = workingDir;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
36 myHgPath = hgPath;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
37 myAuthSettings = authSettings;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
38 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
39
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
40 public PullCommand pull() {
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
41 return new PullCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir, myAuthSettings);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
42 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
43
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
44 public PushCommand push() {
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
45 return new PushCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir, myAuthSettings);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
46 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
47
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
48 public CloneCommand doClone() {
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
49 return new CloneCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir, myAuthSettings);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
50 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
51
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
52 public IdentifyCommand id() {
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
53 return new IdentifyCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir, myAuthSettings);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
54 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
55
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
56 public Init init() {
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
57 return new Init(myCommandSettingsFactory.create(), myHgPath, myWorkingDir, myAuthSettings);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
58 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
59
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
60 public LogCommand log() {
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
61 return new LogCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir, myAuthSettings);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
62 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
63
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
64 public UpdateCommand update() {
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
65 return new UpdateCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir, myAuthSettings);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
66 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
67
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
68 public BranchesCommand branches() {
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
69 return new BranchesCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir, myAuthSettings);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
70 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
71
529
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 521
diff changeset
72 public BookmarksCommand bookmarks() {
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 521
diff changeset
73 return new BookmarksCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir, myAuthSettings);
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 521
diff changeset
74 }
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 521
diff changeset
75
645
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 631
diff changeset
76 public Map<String, String> getBranchRevisions(boolean includeBookmarks) throws VcsException {
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 631
diff changeset
77 Map<String, String> revisions = new HashMap<String, String>();
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 631
diff changeset
78 if (includeBookmarks && version().call().isEqualsOrGreaterThan(BookmarksCommand.REQUIRED_HG_VERSION))
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 631
diff changeset
79 revisions.putAll(bookmarks().call());
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 631
diff changeset
80 revisions.putAll(branches().call());
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 631
diff changeset
81 return revisions;
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 631
diff changeset
82 }
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 631
diff changeset
83
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
84 public StatusCommand status() {
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
85 return new StatusCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir, myAuthSettings);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
86 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
87
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
88 public TagCommand tag() {
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
89 return new TagCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir, myAuthSettings);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
90 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
91
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
92 public CatCommand cat() {
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
93 return new CatCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir, myAuthSettings);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
94 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
95
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
96 public ArchiveCommand archive() {
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
97 return new ArchiveCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir, myAuthSettings);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
98 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
99
432
4a76645fe087 TW-21516 hg version detection should not depend on locale settings
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
100 public VersionCommand version() {
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
101 return new VersionCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir);
432
4a76645fe087 TW-21516 hg version detection should not depend on locale settings
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
102 }
4a76645fe087 TW-21516 hg version detection should not depend on locale settings
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
103
511
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
104 public ParentsCommand parents() {
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
105 return new ParentsCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir);
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
106 }
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
107
631
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 600
diff changeset
108 public MergeCommand merge() {
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 600
diff changeset
109 return new MergeCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir);
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 600
diff changeset
110 }
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 600
diff changeset
111
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 600
diff changeset
112 public ResolveCommand resolve() {
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 600
diff changeset
113 return new ResolveCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir);
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 600
diff changeset
114 }
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 600
diff changeset
115
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 600
diff changeset
116 public CommitCommand commit() {
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 600
diff changeset
117 return new CommitCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir);
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 600
diff changeset
118 }
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 600
diff changeset
119
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
120 public String path() {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
121 return myWorkingDir.getAbsolutePath();
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
122 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
123
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
124 public File getWorkingDir() {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
125 return myWorkingDir;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
126 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
127
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
128 public boolean isEmpty() {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
129 return isEmptyDir(myWorkingDir);
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
130 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
131
529
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 521
diff changeset
132 public void resetBookmarks() {
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 521
diff changeset
133 File dotHg = new File(getWorkingDir(), ".hg");
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 521
diff changeset
134 FileUtil.delete(new File(dotHg, "bookmarks"));
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 521
diff changeset
135 FileUtil.delete(new File(dotHg, "bookmarks.current"));
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 521
diff changeset
136 }
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 521
diff changeset
137
548
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
138 public String getHgPath() {
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
139 return myHgPath;
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
140 }
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
141
425
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
142 @NotNull
472
6d4ce78234c5 TW-23435 list files should take VCS root branch into account
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 433
diff changeset
143 public List<String> listFiles(@NotNull String revision) throws VcsException {
425
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
144 List<FileStatus> fileStatuses = status()
472
6d4ce78234c5 TW-23435 list files should take VCS root branch into account
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 433
diff changeset
145 .fromRevision(revision)
6d4ce78234c5 TW-23435 list files should take VCS root branch into account
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 433
diff changeset
146 .toRevision(revision)
425
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
147 .hideStatus()
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
148 .showAllFiles()
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
149 .call();
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
150 List<String> files = new ArrayList<String>(fileStatuses.size());
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
151 for (FileStatus fileStatus : fileStatuses)
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
152 files.add(fileStatus.getPath());
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
153 return files;
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
154 }
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
155
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
156 public String getWorkingDirRevision() throws VcsException {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
157 return id().inLocalRepository().call();
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
158 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
159
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
160 public boolean containsRevision(@NotNull String revision) {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
161 return containsRevision(new ChangeSet(revision));
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
162 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
163
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
164 public boolean containsRevision(@NotNull ChangeSet cset) {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
165 try {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
166 id().revision(cset).inLocalRepository().call();
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
167 return true;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
168 } catch (VcsException e) {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
169 return false;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
170 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
171 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
172
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
173 public boolean isValidRepository() {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
174 // need better way to check that repository copy is ok
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
175 return myWorkingDir.isDirectory() && new File(myWorkingDir, ".hg").isDirectory();
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
176 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
177
520
1ca68585ffce Support mirrors for subrepos with relative paths
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
178 public void setDefaultPath(@NotNull String defaultPath) throws VcsException {
1ca68585ffce Support mirrors for subrepos with relative paths
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
179 try {
1ca68585ffce Support mirrors for subrepos with relative paths
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
180 File hgrc = new File(new File(myWorkingDir, ".hg"), "hgrc");
1ca68585ffce Support mirrors for subrepos with relative paths
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
181 String content = "[paths]\ndefault = " + defaultPath;
1ca68585ffce Support mirrors for subrepos with relative paths
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
182 FileUtil.writeFileAndReportErrors(hgrc, content);
1ca68585ffce Support mirrors for subrepos with relative paths
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
183 } catch (IOException e) {
1ca68585ffce Support mirrors for subrepos with relative paths
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
184 throw new VcsException(e);
1ca68585ffce Support mirrors for subrepos with relative paths
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
185 }
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
186 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
187
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
188 public boolean hasSubreposAtRevision(@NotNull String revision) {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
189 return !getSubrepositories(new ChangeSet(revision)).isEmpty();
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
190 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
191
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
192 public boolean hasSubreposAtRevision(@NotNull ChangeSet cset) {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
193 return !getSubrepositories(cset).isEmpty();
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
194 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
195
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
196 public Map<String, SubRepo> getSubrepositories(@NotNull String revision) {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
197 return getSubrepositories(new ChangeSet(revision));
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
198 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
199
548
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
200 public List<HgSubrepoConfigChange> getSubrepoConfigChanges(@NotNull String revision) throws VcsException {
511
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
201 if (containsSubrepoConfigChange(revision)) {
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
202 List<String> parents = parents().ofRevision(revision).call();
548
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
203 return getSubrepoConfigChanges(revision, parents);
511
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
204 }
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
205 return emptyList();
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
206 }
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
207
548
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
208 public List<HgSubrepoConfigChange> getSubrepoConfigChanges(@NotNull ChangeSet cset) {
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
209 if (containsSubrepoConfigChange(cset)) {
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
210 List<String> parents = new ArrayList<String>();
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
211 for (ChangeSetRevision p : cset.getParents()) {
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
212 parents.add(p.getId());
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
213 }
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
214 return getSubrepoConfigChanges(cset.getId(), parents);
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
215 }
511
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
216 return emptyList();
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
217 }
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
218
587
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 585
diff changeset
219 public List<HgSubrepoConfigChange> getSubrepoConfigChanges(@NotNull String fromRevision, @NotNull String toRevision) {
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 585
diff changeset
220 return getSubrepoConfigChanges(toRevision, asList(fromRevision));
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 585
diff changeset
221 }
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 585
diff changeset
222
585
d1203382ce76 Collect subrepo changes from first parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 566
diff changeset
223 public List<HgSubrepoConfigChange> getSubrepoConfigChanges(@NotNull String revision, @NotNull List<String> parentRevisions) {
511
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
224 Map<String, SubRepo> curSubrepos = getSubrepositories(revision);
548
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
225 List<Map<String, SubRepo>> prevSubrepos = new ArrayList<Map<String, SubRepo>>();
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
226 for (String parentRevision : parentRevisions) {
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
227 prevSubrepos.add(getSubrepositories(parentRevision));
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
228 }
511
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
229 return getSubrepoConfigChanges(prevSubrepos, curSubrepos);
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
230
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
231 }
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
232
548
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
233 private List<HgSubrepoConfigChange> getSubrepoConfigChanges(@NotNull List<Map<String, SubRepo>> prevSubrepos,
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
234 @NotNull Map<String, SubRepo> curSubrepos) {
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
235 List<HgSubrepoConfigChange> configChanges = new ArrayList<HgSubrepoConfigChange>();
511
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
236 for (Map.Entry<String, SubRepo> e : curSubrepos.entrySet()) {
554
110de749f460 Collect subrepo changes only if subrepo revision changed
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 548
diff changeset
237 String path = e.getKey();
511
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
238 SubRepo curSubrepo = e.getValue();
548
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
239 List<SubRepo> prevs = new ArrayList<SubRepo>();
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
240 for (Map<String, SubRepo> prev : prevSubrepos) {
554
110de749f460 Collect subrepo changes only if subrepo revision changed
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 548
diff changeset
241 SubRepo prevSubrepo = prev.remove(path);
110de749f460 Collect subrepo changes only if subrepo revision changed
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 548
diff changeset
242 if (prevSubrepo == null) //no subrepo at this path in previous revision
110de749f460 Collect subrepo changes only if subrepo revision changed
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 548
diff changeset
243 continue;
110de749f460 Collect subrepo changes only if subrepo revision changed
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 548
diff changeset
244 if (prevSubrepo.equals(curSubrepo)) //subrepo configuration doesn't change since previous revision
110de749f460 Collect subrepo changes only if subrepo revision changed
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 548
diff changeset
245 continue;
110de749f460 Collect subrepo changes only if subrepo revision changed
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 548
diff changeset
246 prevs.add(prevSubrepo);
511
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
247 }
548
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
248 configChanges.add(new HgSubrepoConfigChange(e.getKey(), prevs, curSubrepo));
511
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
249 }
548
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
250 for (Map<String, SubRepo> prev : prevSubrepos) {
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
251 for (Map.Entry<String, SubRepo> e : prev.entrySet()) {
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
252 configChanges.add(new HgSubrepoConfigChange(e.getKey(), e.getValue(), null));
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
253 }
511
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
254 }
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
255 return configChanges;
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
256 }
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
257
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
258 private boolean containsSubrepoConfigChange(@NotNull ChangeSet cset) {
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
259 for (FileStatus f : cset.getModifiedFiles()) {
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
260 if (containsSubrepoConfigChange(f))
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
261 return true;
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
262 }
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
263 return false;
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
264 }
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
265
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
266 private boolean containsSubrepoConfigChange(@NotNull String revision) throws VcsException {
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
267 List<FileStatus> changedFiles = status()
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
268 .fromRevision(revision)
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
269 .toRevision(revision)
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
270 .showAllFiles()
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
271 .call();
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
272 for (FileStatus f : changedFiles) {
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
273 if (containsSubrepoConfigChange(f))
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
274 return true;
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
275 }
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
276 return false;
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
277 }
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
278
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
279 private boolean containsSubrepoConfigChange(@NotNull FileStatus f) {
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
280 return f.getPath().equals(".hgsubstate");
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
281 }
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
282
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
283 //path->subrepo
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
284 public Map<String, SubRepo> getSubrepositories(@NotNull ChangeSet cset) {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
285 String revId = cset.getId();
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
286 Map<String, SubRepo> subrepos = mySubreposCache.get(revId);
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
287 if (subrepos != null)
511
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
288 return new HashMap<String, SubRepo>(subrepos);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
289 CatCommand cc = cat();
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
290 cc.setRevId(revId);
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
291 File catDir = null;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
292 try {
587
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 585
diff changeset
293 catDir = cc.execute(asList(".hgsub", ".hgsubstate"), false);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
294 File hgsub = new File(catDir, ".hgsub");
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
295 File hgsubstate = new File(catDir, ".hgsubstate");
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
296 subrepos = readSubrepositories(hgsub, hgsubstate);
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
297 mySubreposCache.put(revId, subrepos);
511
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
298 return new HashMap<String, SubRepo>(subrepos);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
299 } catch (VcsException e) {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
300 return emptyMap();
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
301 } finally {
478
0a33f3dbd261 Ensure temp dirs are deleted
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 472
diff changeset
302 deleteDir(catDir, Loggers.VCS);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
303 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
304 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
305
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
306 @Override
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
307 public String toString() {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
308 return myWorkingDir.getAbsolutePath();
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
309 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
310
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
311 private Map<String, SubRepo> readSubrepositories(@NotNull final File hgsub, @NotNull final File hgsubstate) {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
312 if (hgsub.exists() && hgsubstate.exists()) {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
313 try {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
314 Map<String, String> path2repo = readHgsub(hgsub);
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
315 Map<String, String> path2revision = readHgsubstate(hgsubstate);
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
316 Map<String, SubRepo> result = new HashMap<String, SubRepo>();
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
317 for (Map.Entry<String, String> entry : path2repo.entrySet()) {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
318 String path = entry.getKey();
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
319 String url = entry.getValue();
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
320 String revision = path2revision.get(path);
511
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
321 if (revision != null)
548
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
322 result.put(path, new SubRepo(path, url, revision));
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
323 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
324 return result;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
325 } catch (IOException e) {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
326 return emptyMap();
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
327 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
328 } else {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
329 return emptyMap();
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
330 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
331 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
332
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
333 /*returns map: relative path -> repository url */
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
334 private Map<String, String> readHgsub(@NotNull final File hgsub) throws IOException {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
335 Map<String, String> result = new HashMap<String, String>();
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
336 for (String line : FileUtil.readFile(hgsub)) {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
337 String[] parts = line.split(" = ");
511
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
338 if (parts.length == 2)
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
339 result.put(parts[0], parts[1]);
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
340 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
341 return result;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
342 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
343
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
344
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
345 /*returns map: relative path -> revision */
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
346 private Map<String, String> readHgsubstate(@NotNull final File hgsubstate) throws IOException {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
347 Map<String, String> result = new HashMap<String, String>();
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
348 for (String line : FileUtil.readFile(hgsubstate)) {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
349 String[] parts = line.split(" ");
511
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
350 if (parts.length == 2)
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
351 result.put(parts[1], parts[0]);
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
352 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
353 return result;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
354 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
355 }