This file is indexed.

/usr/lib/viewvc/bin/make-database is in viewvc-query 1.1.22-1+deb8u1.

This file is owned by root:root, with mode 0o755.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
#!/usr/bin/python
# -*-python-*-
#
# Copyright (C) 1999-2013 The ViewCVS Group. All Rights Reserved.
#
# By using this file, you agree to the terms and conditions set forth in
# the LICENSE.html file which can be found at the top level of the ViewVC
# distribution or at http://viewvc.org/license-1.html.
#
# For more information, visit http://viewvc.org/
#
# -----------------------------------------------------------------------
#
# administrative program for CVSdb; creates a clean database in
# MySQL 3.22 or later
#
# -----------------------------------------------------------------------

import os, sys, string
import popen2
import getopt

## ------------------------------------------------------------------------
## Stuff common to all schemas
##
DATABASE_SCRIPT_COMMON="""\
DROP DATABASE IF EXISTS <dbname>;
CREATE DATABASE <dbname>;

USE <dbname>;
"""

## ------------------------------------------------------------------------
## Version 0:  The original, Bonsai-compatible schema.
##
DATABASE_SCRIPT_VERSION_0="""\
DROP TABLE IF EXISTS branches;
CREATE TABLE branches (
  id mediumint(9) NOT NULL auto_increment,
  branch varchar(64) binary DEFAULT '' NOT NULL,
  PRIMARY KEY (id),
  UNIQUE branch (branch)
) ENGINE=MyISAM;

DROP TABLE IF EXISTS checkins;
CREATE TABLE checkins (
  type enum('Change','Add','Remove'),
  ci_when datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
  whoid mediumint(9) DEFAULT '0' NOT NULL,
  repositoryid mediumint(9) DEFAULT '0' NOT NULL,
  dirid mediumint(9) DEFAULT '0' NOT NULL,
  fileid mediumint(9) DEFAULT '0' NOT NULL,
  revision varchar(32) binary DEFAULT '' NOT NULL,
  stickytag varchar(255) binary DEFAULT '' NOT NULL,
  branchid mediumint(9) DEFAULT '0' NOT NULL,
  addedlines int(11) DEFAULT '0' NOT NULL,
  removedlines int(11) DEFAULT '0' NOT NULL,
  descid mediumint(9),
  UNIQUE repositoryid (repositoryid,dirid,fileid,revision),
  KEY ci_when (ci_when),
  KEY whoid (whoid),
  KEY repositoryid_2 (repositoryid),
  KEY dirid (dirid),
  KEY fileid (fileid),
  KEY branchid (branchid)
) ENGINE=MyISAM;

DROP TABLE IF EXISTS descs;
CREATE TABLE descs (
  id mediumint(9) NOT NULL auto_increment,
  description text,
  hash bigint(20) DEFAULT '0' NOT NULL,
  PRIMARY KEY (id),
  KEY hash (hash)
) ENGINE=MyISAM;

DROP TABLE IF EXISTS dirs;
CREATE TABLE dirs (
  id mediumint(9) NOT NULL auto_increment,
  dir varchar(255) binary DEFAULT '' NOT NULL,
  PRIMARY KEY (id),
  UNIQUE dir (dir)
) ENGINE=MyISAM;

DROP TABLE IF EXISTS files;
CREATE TABLE files (
  id mediumint(9) NOT NULL auto_increment,
  file varchar(255) binary DEFAULT '' NOT NULL,
  PRIMARY KEY (id),
  UNIQUE file (file)
) ENGINE=MyISAM;

DROP TABLE IF EXISTS people;
CREATE TABLE people (
  id mediumint(9) NOT NULL auto_increment,
  who varchar(128) binary DEFAULT '' NOT NULL,
  PRIMARY KEY (id),
  UNIQUE who (who)
) ENGINE=MyISAM;

DROP TABLE IF EXISTS repositories;
CREATE TABLE repositories (
  id mediumint(9) NOT NULL auto_increment,
  repository varchar(64) binary DEFAULT '' NOT NULL,
  PRIMARY KEY (id),
  UNIQUE repository (repository)
) ENGINE=MyISAM;

DROP TABLE IF EXISTS tags;
CREATE TABLE tags (
  repositoryid mediumint(9) DEFAULT '0' NOT NULL,
  branchid mediumint(9) DEFAULT '0' NOT NULL,
  dirid mediumint(9) DEFAULT '0' NOT NULL,
  fileid mediumint(9) DEFAULT '0' NOT NULL,
  revision varchar(32) binary DEFAULT '' NOT NULL,
  UNIQUE repositoryid (repositoryid,dirid,fileid,branchid,revision),
  KEY repositoryid_2 (repositoryid),
  KEY dirid (dirid),
  KEY fileid (fileid),
  KEY branchid (branchid)
) ENGINE=MyISAM;
"""

## ------------------------------------------------------------------------
## Version 1:  Adds the 'metadata' table.  Adds 'descid' index to
##             'checkins' table, and renames that table to 'commits'.
##
DATABASE_SCRIPT_VERSION_1="""\
DROP TABLE IF EXISTS branches;
CREATE TABLE branches (
  id mediumint(9) NOT NULL auto_increment,
  branch varchar(64) binary DEFAULT '' NOT NULL,
  PRIMARY KEY (id),
  UNIQUE branch (branch)
) ENGINE=MyISAM;

DROP TABLE IF EXISTS commits;
CREATE TABLE commits (
  type enum('Change','Add','Remove'),
  ci_when datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
  whoid mediumint(9) DEFAULT '0' NOT NULL,
  repositoryid mediumint(9) DEFAULT '0' NOT NULL,
  dirid mediumint(9) DEFAULT '0' NOT NULL,
  fileid mediumint(9) DEFAULT '0' NOT NULL,
  revision varchar(32) binary DEFAULT '' NOT NULL,
  stickytag varchar(255) binary DEFAULT '' NOT NULL,
  branchid mediumint(9) DEFAULT '0' NOT NULL,
  addedlines int(11) DEFAULT '0' NOT NULL,
  removedlines int(11) DEFAULT '0' NOT NULL,
  descid mediumint(9),
  UNIQUE repositoryid (repositoryid,dirid,fileid,revision),
  KEY ci_when (ci_when),
  KEY whoid (whoid),
  KEY repositoryid_2 (repositoryid),
  KEY dirid (dirid),
  KEY fileid (fileid),
  KEY branchid (branchid),
  KEY descid (descid)
) ENGINE=MyISAM;

DROP TABLE IF EXISTS descs;
CREATE TABLE descs (
  id mediumint(9) NOT NULL auto_increment,
  description text,
  hash bigint(20) DEFAULT '0' NOT NULL,
  PRIMARY KEY (id),
  KEY hash (hash)
) ENGINE=MyISAM;

DROP TABLE IF EXISTS dirs;
CREATE TABLE dirs (
  id mediumint(9) NOT NULL auto_increment,
  dir varchar(255) binary DEFAULT '' NOT NULL,
  PRIMARY KEY (id),
  UNIQUE dir (dir)
) ENGINE=MyISAM;

DROP TABLE IF EXISTS files;
CREATE TABLE files (
  id mediumint(9) NOT NULL auto_increment,
  file varchar(255) binary DEFAULT '' NOT NULL,
  PRIMARY KEY (id),
  UNIQUE file (file)
) ENGINE=MyISAM;

DROP TABLE IF EXISTS people;
CREATE TABLE people (
  id mediumint(9) NOT NULL auto_increment,
  who varchar(128) binary DEFAULT '' NOT NULL,
  PRIMARY KEY (id),
  UNIQUE who (who)
) ENGINE=MyISAM;

DROP TABLE IF EXISTS repositories;
CREATE TABLE repositories (
  id mediumint(9) NOT NULL auto_increment,
  repository varchar(64) binary DEFAULT '' NOT NULL,
  PRIMARY KEY (id),
  UNIQUE repository (repository)
) ENGINE=MyISAM;

DROP TABLE IF EXISTS tags;
CREATE TABLE tags (
  repositoryid mediumint(9) DEFAULT '0' NOT NULL,
  branchid mediumint(9) DEFAULT '0' NOT NULL,
  dirid mediumint(9) DEFAULT '0' NOT NULL,
  fileid mediumint(9) DEFAULT '0' NOT NULL,
  revision varchar(32) binary DEFAULT '' NOT NULL,
  UNIQUE repositoryid (repositoryid,dirid,fileid,branchid,revision),
  KEY repositoryid_2 (repositoryid),
  KEY dirid (dirid),
  KEY fileid (fileid),
  KEY branchid (branchid)
) ENGINE=MyISAM;

DROP TABLE IF EXISTS metadata;
CREATE TABLE metadata (
  name varchar(255) binary DEFAULT '' NOT NULL,
  value text,
  PRIMARY KEY (name),
  UNIQUE name (name)
) ENGINE=MyISAM;
INSERT INTO metadata (name, value) VALUES ('version', '1');
"""

BONSAI_COMPAT="""
WARNING:  Creating Bonsai-compatible legacy database version.  Some ViewVC
features may not be available, or may not perform especially well.

"""

## ------------------------------------------------------------------------

def usage_and_exit(errmsg=None):
  stream = errmsg is None and sys.stdout or sys.stderr
  stream.write("""\
Usage: %s [OPTIONS]

This script creates the database and tables in MySQL used by the
ViewVC checkin database.  In order to operate correctly, it needs to
know the following:  your database server hostname, database user,
database user password, and database name.  (You will be prompted for
any of this information that you do not provide via command-line
options.)  This script will use the 'mysql' program to create the
database for you.  You will then need to set the appropriate
parameters in the [cvsdb] section of your viewvc.conf file.

NOTE: If a hostname or port is supplied at the command line or during
interactive prompting, this script will pass '--protocol=TCP' to
'mysql'.

Options:

  --dbname=ARG        Use ARG as the ViewVC database name to create.
                      [Default: ViewVC]

  --help              Show this usage message.
  
  --hostname=ARG      Use ARG as the hostname for the MySQL connection.

  --port=ARG          Use ARG as the port for the MySQL connection.

  --password=ARG      Use ARG as the password for the MySQL connection.

  --username=ARG      Use ARG as the username for the MySQL connection.

  --version=ARG       Create the database using the schema employed by
                      version ARG of ViewVC.  Valid values are:
                      [ "1.0" ]
                            
""" % (os.path.basename(sys.argv[0])))
  if errmsg is not None:
    stream.write("[ERROR] %s.\n" % (errmsg))
    sys.exit(1)
  sys.exit(0)


if __name__ == "__main__":
  try:
    # Parse the command-line options, if any.
    dbname = version = hostname = port = username = password = None
    opts, args = getopt.getopt(sys.argv[1:], '', [ 'dbname=',
                                                   'help',
                                                   'hostname=',
                                                   'port=',
                                                   'password=',
                                                   'username=',
                                                   'version=',
                                                   ])
    if len(args) > 0:
      usage_and_exit("Unexpected command-line parameters")
    for name, value in opts:
      if name == '--help':
        usage_and_exit(0)
      elif name == '--dbname':
        dbname = value
      elif name == '--hostname':
        hostname = value
      elif name == '--port':
        port = value
      elif name == '--username':
        username = value
      elif name == '--password':
        password = value
      elif name == '--version':
        if value in ["1.0"]:
          version = value
        else:
          usage_and_exit("Invalid version specified")

    # Prompt for information not provided via command-line options.
    if hostname is None:
      hostname = raw_input("MySQL Hostname (leave blank for default): ")
    if port is None:
      port = raw_input("MySQL Port (leave blank for default): ")
    if username is None:
      username = raw_input("MySQL User: ")
    if password is None:
      password = raw_input("MySQL Password: ")
    if dbname is None:
      dbname = raw_input("ViewVC Database Name [default: ViewVC]: ") or "ViewVC"

    # Create the database.
    dscript = string.replace(DATABASE_SCRIPT_COMMON, "<dbname>", dbname)
    if version == "1.0":
      print BONSAI_COMPAT
      dscript = dscript + DATABASE_SCRIPT_VERSION_0
    else:
      dscript = dscript + DATABASE_SCRIPT_VERSION_1

    # Calculate command arguments.
    cmd_args = "--user=%s --password=%s" % (username, password)
    if hostname or port:
      cmd_args = cmd_args + " --protocol=TCP"
    if hostname:
      cmd_args = cmd_args + " --host=%s" % (hostname)
    if port:
      cmd_args = cmd_args + " --port=%s" % (port)
      
    if sys.platform == "win32":
      cmd = "mysql %s" % (cmd_args)
      mysql = os.popen(cmd, "w") # popen2.Popen3 is not provided on windows
      mysql.write(dscript)
      status = mysql.close()
    else:
      cmd = "{ mysql %s ; } 2>&1" % (cmd_args)
      pipes = popen2.Popen3(cmd)
      pipes.tochild.write(dscript)
      pipes.tochild.close()
      print pipes.fromchild.read()
      status = pipes.wait()

    if status:
      print "[ERROR] The database did not create sucessfully."
      sys.exit(1)

    print "Database created successfully.  Don't forget to configure the "
    print "[cvsdb] section of your viewvc.conf file."
  except KeyboardInterrupt:
    pass
  sys.exit(0)