View Javadoc
1   /*
2    * Copyright (C) 2008, Jonas Fonseca <fonseca@diku.dk>
3    * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org> and others
4    *
5    * This program and the accompanying materials are made available under the
6    * terms of the Eclipse Distribution License v. 1.0 which is available at
7    * https://www.eclipse.org/org/documents/edl-v10.php.
8    *
9    * SPDX-License-Identifier: BSD-3-Clause
10   */
11  
12  package org.eclipse.jgit.pgm;
13  
14  import java.io.IOException;
15  import java.util.ArrayList;
16  import java.util.List;
17  
18  import org.eclipse.jgit.lib.FileMode;
19  import org.eclipse.jgit.pgm.opt.PathTreeFilterHandler;
20  import org.eclipse.jgit.treewalk.AbstractTreeIterator;
21  import org.eclipse.jgit.treewalk.TreeWalk;
22  import org.eclipse.jgit.treewalk.filter.AndTreeFilter;
23  import org.eclipse.jgit.treewalk.filter.TreeFilter;
24  import org.kohsuke.args4j.Argument;
25  import org.kohsuke.args4j.Option;
26  
27  @Command(usage = "usage_ShowDiffTree")
28  class DiffTree extends TextBuiltin {
29  	@Option(name = "--recursive", usage = "usage_recurseIntoSubtrees", aliases = { "-r" })
30  	private boolean recursive;
31  
32  	@Argument(index = 0, metaVar = "metaVar_treeish", required = true)
33  	void tree_0(final AbstractTreeIterator c) {
34  		trees.add(c);
35  	}
36  
37  	@Argument(index = 1, metaVar = "metaVar_treeish", required = true)
38  	private List<AbstractTreeIterator> trees = new ArrayList<>();
39  
40  	@Option(name = "--", metaVar = "metaVar_path", handler = PathTreeFilterHandler.class)
41  	private TreeFilter pathFilter = TreeFilter.ALL;
42  
43  	/** {@inheritDoc} */
44  	@Override
45  	protected void run() {
46  		try (TreeWalkeeWalk.html#TreeWalk">TreeWalk walk = new TreeWalk(db)) {
47  			walk.setRecursive(recursive);
48  			for (AbstractTreeIterator i : trees)
49  				walk.addTree(i);
50  			walk.setFilter(AndTreeFilter.create(TreeFilter.ANY_DIFF, pathFilter));
51  
52  			final int nTree = walk.getTreeCount();
53  			while (walk.next()) {
54  				for (int i = 1; i < nTree; i++) {
55  					outw.print(':');
56  				}
57  				for (int i = 0; i < nTree; i++) {
58  					final FileMode m = walk.getFileMode(i);
59  					final String s = m.toString();
60  					for (int pad = 6 - s.length(); pad > 0; pad--) {
61  						outw.print('0');
62  					}
63  					outw.print(s);
64  					outw.print(' ');
65  				}
66  
67  				for (int i = 0; i < nTree; i++) {
68  					outw.print(walk.getObjectId(i).name());
69  					outw.print(' ');
70  				}
71  
72  				char chg = 'M';
73  				if (nTree == 2) {
74  					final int m0 = walk.getRawMode(0);
75  					final int m1 = walk.getRawMode(1);
76  					if (m0 == 0 && m1 != 0) {
77  						chg = 'A';
78  					} else if (m0 != 0 && m1 == 0) {
79  						chg = 'D';
80  					} else if (m0 != m1 && walk.idEqual(0, 1)) {
81  						chg = 'T';
82  					}
83  				}
84  				outw.print(chg);
85  
86  				outw.print('\t');
87  				outw.print(walk.getPathString());
88  				outw.println();
89  			}
90  		} catch (IOException e) {
91  			throw die(e.getMessage(), e);
92  		}
93  	}
94  }