]> git.saurik.com Git - apt.git/blob - cmdline/apt-mark
* merge of the debian-expermental-ma branch
[apt.git] / cmdline / apt-mark
1 #!/usr/bin/python
2
3 from optparse import OptionParser
4
5 import sys
6 import os.path
7
8 try:
9 import apt_pkg
10 except ImportError:
11 print >> sys.stderr, "Error importing apt_pkg, is python-apt installed?"
12 sys.exit(1)
13
14 actions = { "markauto" : 1,
15 "unmarkauto": 0
16 }
17
18 def show_automatic(filename):
19 if not os.path.exists(STATE_FILE):
20 return
21 auto = set()
22 tagfile = apt_pkg.TagFile(open(STATE_FILE))
23 for section in tagfile:
24 pkgname = section.get("Package")
25 autoInst = section.get("Auto-Installed")
26 if int(autoInst):
27 auto.add(pkgname)
28 print "\n".join(sorted(auto))
29
30
31 def mark_unmark_automatic(filename, action, pkgs):
32 " mark or unmark automatic flag"
33 # open the statefile
34 if os.path.exists(STATE_FILE):
35 try:
36 tagfile = apt_pkg.TagFile(open(STATE_FILE))
37 outfile = open(STATE_FILE+".tmp","w")
38 except IOError, msg:
39 print "%s, are you root?" % (msg)
40 sys.exit(1)
41 for section in tagfile:
42 pkgname = section.get("Package")
43 autoInst = section.get("Auto-Installed")
44 if pkgname in pkgs:
45 if options.verbose:
46 print "changing %s to %s" % (pkgname,action)
47 newsec = apt_pkg.rewrite_section(section,
48 [],
49 [ ("Auto-Installed",str(action)) ])
50 pkgs.remove(pkgname)
51 outfile.write(newsec+"\n")
52 else:
53 outfile.write(str(section)+"\n")
54 if action == 1:
55 for pkgname in pkgs:
56 if options.verbose:
57 print "changing %s to %s" % (pkgname,action)
58 outfile.write("Package: %s\nAuto-Installed: %d\n\n" % (pkgname, action))
59 # all done, rename the tmpfile
60 os.chmod(outfile.name, 0644)
61 os.rename(outfile.name, STATE_FILE)
62 os.chmod(STATE_FILE, 0644)
63
64
65 if __name__ == "__main__":
66 apt_pkg.init()
67
68 # option parsing
69 parser = OptionParser()
70 parser.usage = "%prog [options] {markauto|unmarkauto} packages..."
71 parser.epilog = "apt-mark is deprecated, use apt-get markauto/unmarkauto."
72 parser.add_option("-f", "--file", action="store", type="string",
73 dest="filename",
74 help="read/write a different file")
75 parser.add_option("-v", "--verbose",
76 action="store_true", dest="verbose", default=False,
77 help="print verbose status messages to stdout")
78 (options, args) = parser.parse_args()
79
80 if not args:
81 parser.print_help()
82 sys.exit(1)
83
84 # get the state-file
85 if not options.filename:
86 STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"
87 else:
88 STATE_FILE=options.filename
89
90 if len(args) == 0:
91 parser.error("first argument must be 'markauto', 'unmarkauto' or 'showauto'")
92
93 if args[0] == "showauto":
94 show_automatic(STATE_FILE)
95 else:
96 # get pkgs to change
97 if args[0] not in actions.keys():
98 parser.error("first argument must be 'markauto', 'unmarkauto' or 'showauto'")
99 pkgs = args[1:]
100 action = actions[args[0]]
101 mark_unmark_automatic(STATE_FILE, action, pkgs)