diff options
author | Carlo Landmeter <clandmeter@gmail.com> | 2011-04-03 23:10:48 +0000 |
---|---|---|
committer | Carlo Landmeter <clandmeter@gmail.com> | 2011-04-03 23:10:48 +0000 |
commit | e21d8da40631e8d9f2f3bbb2db83762ee4474cec (patch) | |
tree | 046790a62b403e8e6bded775bd34c79bd96f21c4 | |
parent | 849f4344d13b0060829b61b0ee2ad4660fff45b0 (diff) | |
download | apk_browser-e21d8da40631e8d9f2f3bbb2db83762ee4474cec.tar.bz2 apk_browser-e21d8da40631e8d9f2f3bbb2db83762ee4474cec.tar.xz |
convert files to unix file format.
netbeans git plugins likes to convert them to dos.
-rw-r--r-- | apk_browser.info | 16 | ||||
-rw-r--r-- | apk_browser.install | 378 | ||||
-rw-r--r-- | apk_browser.module | 748 |
3 files changed, 571 insertions, 571 deletions
diff --git a/apk_browser.info b/apk_browser.info index 572b0d1..1429aaf 100644 --- a/apk_browser.info +++ b/apk_browser.info @@ -1,9 +1,9 @@ -name = "APK browser"
-description = "Package browser for Alpine Linux"
-version = "7.x-1.x-dev"
-core = "7.x"
-dependencies[] = taxonomy
-dependencies[] = field_ui
-dependencies[] = user_reference
-files[] = apk_browser.views_default.inc
+name = "APK browser" +description = "Package browser for Alpine Linux" +version = "7.x-1.x-dev" +core = "7.x" +dependencies[] = taxonomy +dependencies[] = field_ui +dependencies[] = user_reference +files[] = apk_browser.views_default.inc configure = "admin/config/apk_browser/settings"
\ No newline at end of file diff --git a/apk_browser.install b/apk_browser.install index 345f10f..a5cd42e 100644 --- a/apk_browser.install +++ b/apk_browser.install @@ -1,189 +1,189 @@ -<?php
-
-function apk_browser_install() {
- /*
- * Alpine packages are stored as nodes.
- * To make sure we have content type we
- * create it with hook install so its a
- * system content type which cannot be
- * deleted.
- */
- // use get_t() to get the name of our localization function for translation
- // during install, when t() is not available.
- $t = get_t();
- //basic new node settings
- $node_fields = array(
- 'type' => 'apk', //machine name
- 'name' => 'Alpine package', // human name
- 'base' => 'node_content', //api callback
- 'description' => $t('Content type to store Alpine Linux packages'),
- 'title_label' => $t('Package'),
- );
- //set missing defaults and save the node type
- $content_type = node_type_set_defaults($node_fields);
- node_type_save($content_type);
-
- /*
- * Create all the fields and instances we are adding to our content type.
- */
- foreach (_apk_browser_field_vars() as $name => $fvars) {
- if (!field_info_field($name)) {
- $field = array(
- 'field_name' => $name,
- 'cardinality' => (isset($fvars['cdl'])) ? $fvars['cdl'] : '1',
- 'type' => (isset($fvars['type'])) ? $fvars['type'] : 'text',
- 'settings' => array(
- 'max_length' => (isset($fvars['length'])) ? $fvars['length'] : '255',
- ),
- );
- field_create_field($field);
- }
- // now all instances
- if (!field_info_instance('node', $name, 'apk')) {
- $instance = array(
- 'field_name' => $name,
- 'label' => $fvars['label'],
- 'type' => 'text',
- 'entity_type' => 'node',
- 'bundle' => 'apk',
- 'widget' => array(
- 'type' => (isset($fvars['widget'])) ? $fvars['widget'] : 'text_textfield',
- ),
- 'display' => array(
- 'default' => array(
- 'label' => 'inline'
- )
- )
- );
- field_create_instance($instance);
- }
- }
-
- /*
- * Create taxonamy vocab
- * create table and asign it
- */
- $vnames = array(
- 'repo' => $t('Repository'),
- 'arch' => $t('Architecture')
- );
- foreach ($vnames as $vname => $desc) {
- $fieldname = 'taxonomy_apk_' . $vname;
- $machinename = 'apk_' . $vname;
- $vedit = array(
- 'name' => $desc,
- 'description' => $t('@desc taxonomy', array('@desc' => $desc)),
- 'machine_name' => $machinename
- );
- if (taxonomy_vocabulary_save((object) $vedit)) {
- if (!field_info_field($fieldname)) {
- $field = array(
- 'field_name' => $fieldname,
- 'type' => 'taxonomy_term_reference',
- //sets the number of terms which can be selected
- 'cardinality' => '1',
- 'settings' => array(
- 'allowed_values' => array(
- array(
- 'vocabulary' => $machinename,
- 'parent' => 0,
- ),
- ),
- ),
- );
- field_create_field($field);
- }
- if (!field_info_instance('node', $fieldname, 'taxonomy_term_reference')) {
- $instance = array(
- 'field_name' => $fieldname,
- 'entity_type' => 'node',
- 'label' => $desc,
- 'bundle' => 'apk',
- 'required' => TRUE,
- 'widget' => array(
- 'type' => 'options_select',
- )
- );
- field_create_instance($instance);
- }
- }
- }
-}
-
-//cleanup database, removing all apk entries
-function apk_browser_uninstall() {
- $nfields = array_keys(_apk_browser_field_vars());
- //delete the content type
- node_type_delete('apk');
- //delete the apk node fields
- foreach ($nfields as $nfield) {
- field_delete_field($nfield);
- }
- //delete all apk related instaces
- $instances = field_info_instances('node', 'apk');
- foreach ($instances as $instance) {
- field_delete_instance($instance, TRUE);
- }
- field_delete_field('taxonomy_apk_repo');
- field_delete_field('taxonomy_apk_arch');
- //delete taxonomy
- $vocabulary = taxonomy_vocabulary_machine_name_load('apk_arch');
- if ($vocabulary) {
- taxonomy_vocabulary_delete($vocabulary->vid);
- }
- $vocabulary = taxonomy_vocabulary_machine_name_load('apk_repo');
- if ($vocabulary) {
- taxonomy_vocabulary_delete($vocabulary->vid);
- }
- db_delete('variable')->condition('name', 'apk_%%', 'LIKE')->execute();
-}
-
-/*
- * functions which return apk browser
- * structure and variables will be used
- * for install and uninstall
- */
-
-function _apk_browser_field_vars() {
- $t = get_t();
- //return array of fields variables
- return array(
- 'apk_checksum' => array(
- 'label' => $t('Checksum')
- ),
- 'apk_version' => array(
- 'label' => $t('Version')
- ),
- 'apk_size' => array(
- 'label' => $t('Size')
- ),
- 'apk_isize' => array(
- 'label' => $t('Installed size')
- ),
- 'apk_description' => array(
- 'label' => $t('Description'),
- 'length' => '1000'
- ),
- 'apk_url' => array(
- 'label' => $t('URL'),
- ),
- 'apk_license' => array(
- 'label' => $t('License')
- ),
- 'apk_depends' => array(
- 'label' => $t('Dependencies'),
- 'cdl' => '-1'
- ),
- 'apk_maintainer' => array(
- 'label' => $t('Maintainer'),
- 'type' => 'user_reference',
- 'widget' => 'options_select'
- ),
- 'apk_contributor' => array(
- 'label' => $t('Contributor'),
- 'type' => 'user_reference',
- 'widget' => 'user_reference_autocomplete',
- 'cdl' => '-1'
- )
- );
-}
+<?php + +function apk_browser_install() { + /* + * Alpine packages are stored as nodes. + * To make sure we have content type we + * create it with hook install so its a + * system content type which cannot be + * deleted. + */ + // use get_t() to get the name of our localization function for translation + // during install, when t() is not available. + $t = get_t(); + //basic new node settings + $node_fields = array( + 'type' => 'apk', //machine name + 'name' => 'Alpine package', // human name + 'base' => 'node_content', //api callback + 'description' => $t('Content type to store Alpine Linux packages'), + 'title_label' => $t('Package'), + ); + //set missing defaults and save the node type + $content_type = node_type_set_defaults($node_fields); + node_type_save($content_type); + + /* + * Create all the fields and instances we are adding to our content type. + */ + foreach (_apk_browser_field_vars() as $name => $fvars) { + if (!field_info_field($name)) { + $field = array( + 'field_name' => $name, + 'cardinality' => (isset($fvars['cdl'])) ? $fvars['cdl'] : '1', + 'type' => (isset($fvars['type'])) ? $fvars['type'] : 'text', + 'settings' => array( + 'max_length' => (isset($fvars['length'])) ? $fvars['length'] : '255', + ), + ); + field_create_field($field); + } + // now all instances + if (!field_info_instance('node', $name, 'apk')) { + $instance = array( + 'field_name' => $name, + 'label' => $fvars['label'], + 'type' => 'text', + 'entity_type' => 'node', + 'bundle' => 'apk', + 'widget' => array( + 'type' => (isset($fvars['widget'])) ? $fvars['widget'] : 'text_textfield', + ), + 'display' => array( + 'default' => array( + 'label' => 'inline' + ) + ) + ); + field_create_instance($instance); + } + } + + /* + * Create taxonamy vocab + * create table and asign it + */ + $vnames = array( + 'repo' => $t('Repository'), + 'arch' => $t('Architecture') + ); + foreach ($vnames as $vname => $desc) { + $fieldname = 'taxonomy_apk_' . $vname; + $machinename = 'apk_' . $vname; + $vedit = array( + 'name' => $desc, + 'description' => $t('@desc taxonomy', array('@desc' => $desc)), + 'machine_name' => $machinename + ); + if (taxonomy_vocabulary_save((object) $vedit)) { + if (!field_info_field($fieldname)) { + $field = array( + 'field_name' => $fieldname, + 'type' => 'taxonomy_term_reference', + //sets the number of terms which can be selected + 'cardinality' => '1', + 'settings' => array( + 'allowed_values' => array( + array( + 'vocabulary' => $machinename, + 'parent' => 0, + ), + ), + ), + ); + field_create_field($field); + } + if (!field_info_instance('node', $fieldname, 'taxonomy_term_reference')) { + $instance = array( + 'field_name' => $fieldname, + 'entity_type' => 'node', + 'label' => $desc, + 'bundle' => 'apk', + 'required' => TRUE, + 'widget' => array( + 'type' => 'options_select', + ) + ); + field_create_instance($instance); + } + } + } +} + +//cleanup database, removing all apk entries +function apk_browser_uninstall() { + $nfields = array_keys(_apk_browser_field_vars()); + //delete the content type + node_type_delete('apk'); + //delete the apk node fields + foreach ($nfields as $nfield) { + field_delete_field($nfield); + } + //delete all apk related instaces + $instances = field_info_instances('node', 'apk'); + foreach ($instances as $instance) { + field_delete_instance($instance, TRUE); + } + field_delete_field('taxonomy_apk_repo'); + field_delete_field('taxonomy_apk_arch'); + //delete taxonomy + $vocabulary = taxonomy_vocabulary_machine_name_load('apk_arch'); + if ($vocabulary) { + taxonomy_vocabulary_delete($vocabulary->vid); + } + $vocabulary = taxonomy_vocabulary_machine_name_load('apk_repo'); + if ($vocabulary) { + taxonomy_vocabulary_delete($vocabulary->vid); + } + db_delete('variable')->condition('name', 'apk_%%', 'LIKE')->execute(); +} + +/* + * functions which return apk browser + * structure and variables will be used + * for install and uninstall + */ + +function _apk_browser_field_vars() { + $t = get_t(); + //return array of fields variables + return array( + 'apk_checksum' => array( + 'label' => $t('Checksum') + ), + 'apk_version' => array( + 'label' => $t('Version') + ), + 'apk_size' => array( + 'label' => $t('Size') + ), + 'apk_isize' => array( + 'label' => $t('Installed size') + ), + 'apk_description' => array( + 'label' => $t('Description'), + 'length' => '1000' + ), + 'apk_url' => array( + 'label' => $t('URL'), + ), + 'apk_license' => array( + 'label' => $t('License') + ), + 'apk_depends' => array( + 'label' => $t('Dependencies'), + 'cdl' => '-1' + ), + 'apk_maintainer' => array( + 'label' => $t('Maintainer'), + 'type' => 'user_reference', + 'widget' => 'options_select' + ), + 'apk_contributor' => array( + 'label' => $t('Contributor'), + 'type' => 'user_reference', + 'widget' => 'user_reference_autocomplete', + 'cdl' => '-1' + ) + ); +} diff --git a/apk_browser.module b/apk_browser.module index 4998add..cc5f173 100644 --- a/apk_browser.module +++ b/apk_browser.module @@ -1,375 +1,375 @@ -<?php
-
-function apk_browser_menu() {
- //Menu item to test new functions.
- $items['apk_browser'] = array(
- 'title' => 'Import APK',
- 'description' => 'Import APK packages',
- 'page callback' => 'apk_browser_import_apk',
- 'access arguments' => array('access apk browser'),
- );
- $items['admin/config/apk_browser'] = array(
- 'title' => 'Package browser',
- 'description' => 'Configure package browser',
- 'page callback' => 'system_admin_menu_block_page',
- 'access arguments' => array('access apk browser'),
- //system_admin_menu_block_page needs admin inc
- 'file' => 'system.admin.inc',
- 'file path' => drupal_get_path('module', 'system'),
- );
- $items['admin/config/apk_browser/settings'] = array(
- 'title' => 'Settings',
- 'description' => 'Configure global APK browser settings',
- 'page callback' => 'drupal_get_form',
- 'page arguments' => array('apk_browser_settings'),
- 'access arguments' => array('access apk browser'),
- );
- $items['admin/config/apk_browser/repositories'] = array(
- 'title' => 'Repositories',
- 'description' => 'Configure APK repositories',
- 'page callback' => 'apk_browser_repositories_list',
- 'access arguments' => array('access apk browser'),
- );
- $items['admin/config/apk_browser/repositories/add'] = array(
- 'title' => 'Add repository',
- 'description' => 'Add repositoriy',
- 'page callback' => 'drupal_get_form',
- 'page arguments' => array('apk_browser_repository_edit_form'),
- 'access arguments' => array('access apk browser'),
- );
- $items['admin/config/apk_browser/repositories/%/edit'] = array(
- 'title' => 'Edit repository',
- 'description' => 'Edit repositoriy',
- 'page callback' => 'drupal_get_form',
- 'page arguments' => array('apk_browser_repository_edit_form', 4),
- 'access arguments' => array('access apk browser'),
- 'access callback' => TRUE,
- );
- $items['admin/config/apk_browser/repositories/%/delete'] = array(
- 'title' => 'Delete repository',
- 'description' => 'Delete repositoriy',
- 'page callback' => 'drupal_get_form',
- 'page arguments' => array('apk_browser_repository_delete_form', 4),
- 'access arguments' => array('access apk browser'),
- 'access callback' => TRUE,
- );
- return $items;
-}
-
-function apk_browser_permission() {
- return array(
- 'access apk browser' => array(
- 'title' => t('Access APK browser'),
- 'description' => t('Access permissions for APK browser'),
- ),
- );
-}
-
-function apk_browser_settings($form) {
- $form['settings'] = array(
- '#type' => 'fieldset',
- '#title' => t('APK browser settings'),
- );
- $form['settings']['apk_import_debug'] = array(
- '#type' => 'checkbox',
- '#title' => t('Import debugging'),
- '#description' => t('Write import debugging to watchdog'),
- '#default_value' => variable_get('apk_import_debug', '0')
- );
- return system_settings_form($form);
-}
-
-function apk_browser_repository_delete_form($form, &$form_state, $rid) {
- $repos = variable_get('apk_repositories', array());
- if (array_key_exists($rid, $repos)) {
- $form['repo_id'] = array('#type' => 'hidden', '#value' => $rid);
- return confirm_form($form, t('Are you sure you want to delete repository with ID @ID?', array('@ID' => $rid)), 'admin/config/apk_browser/repositories', t('This action cannot be undone.'), t('Delete repository'), t('Cancel'));
- } else {
- drupal_set_message(t('Please select an existing repository ID'), 'error');
- drupal_goto('admin/config/apk_browser/repositories');
- }
-}
-
-function apk_browser_repository_delete_form_submit($form, &$form_state) {
- $repos = variable_get('apk_repositories', array());
- unset($repos[$form_state['values']['repo_id']]);
- variable_set('apk_repositories', array_values($repos));
- drupal_set_message(t('Repository deleted'));
- $form_state['redirect'] = 'admin/config/apk_browser/repositories';
-}
-
-function apk_browser_repository_edit_form($form, &$form_state, $rid = array()) {
- $repos = variable_get('apk_repositories', array());
- if (is_string($rid)) {
- $form['repo_id'] = array('#type' => 'hidden', '#value' => $rid);
- if (!array_key_exists($rid, $repos)) {
- drupal_set_message(t('Please select an existing repository ID'), 'error');
- drupal_goto('admin/config/apk_browser/repositories');
- }
- }
- $repo = taxonomy_vocabulary_machine_name_load('apk_repo');
- $repo_tree = taxonomy_get_tree($repo->vid);
- $arch = taxonomy_vocabulary_machine_name_load('apk_arch');
- $arch_tree = taxonomy_get_tree($arch->vid);
- if (empty($arch_tree) || empty($repo_tree)) {
- $form['warning'] = array(
- '#type' => 'item',
- '#markup' => '<p>Please add terms to you your repositories and architectures</p>'
- . l('Manage Taxonomy', 'admin/structure/taxonomy')
- );
- } else {
- $form['settings'] = array(
- '#type' => 'fieldset',
- '#title' => t('Repository settings'),
- );
- $form['settings']['apk_repo_url'] = array(
- '#type' => 'textfield',
- '#title' => t('Repository URL'),
- '#size' => '100',
- '#default_value' => is_string($rid) ? $repos[$rid]['url'] : '',
- '#description' => t('Link to the APKINDEX.tar.gz file inside the repository'),
- '#required' => TRUE,
- );
- foreach ($repo_tree as $key => $term) {
- $repo_options[$term->tid] = $term->name;
- }
- //generate a form item to select terms
- $form['settings']['repo'] = array(
- '#type' => 'select',
- '#options' => $repo_options,
- '#title' => 'Select repository',
- '#default_value' => is_string($rid) ? $repos[$rid]['repo'] : '',
- '#description' => t('Please make sure you select the correct repository.
- Preventing to do so will break package listing')
- );
- foreach ($arch_tree as $key => $term) {
- $arch_options[$term->tid] = $term->name;
- }
- $form['settings']['arch'] = array(
- '#type' => 'select',
- '#options' => $arch_options,
- '#default_value' => is_string($rid) ? $repos[$rid]['arch'] : '',
- '#title' => 'Select architecture',
- '#description' => t('Please make sure you select the correct architecture.
- Preventing to dox so will break package listing')
- );
- $form['submit'] = array(
- '#type' => 'submit',
- '#value' => t('Save repository')
- );
- }
- return $form;
-}
-
-function apk_browser_repository_edit_form_validate($form, &$form_state) {
- if (!valid_url($form_state['values']['apk_repo_url'], TRUE)) {
- form_set_error('apk_repo_url', t('Please specify a valid URL!'));
- }
- //foreach (variable_get('apk_repositories', array()) as $repo) {
- // if ($form_state['values']['apk_repo_url'] == $repo['url']) {
- // form_set_error('apk_repo_url', t('You are trying to add a double url'));
- // }
- // }
-}
-
-function apk_browser_repository_edit_form_submit($form, &$form_state) {
- $repos = array(
- 'url' => $form_state['values']['apk_repo_url'],
- 'arch' => $form_state['values']['arch'],
- 'repo' => $form_state['values']['repo']
- );
- $repo_db = variable_get('apk_repositories', array());
- isset($form_state['values']['repo_id']) ? ( $repo_db[$form_state['values']['repo_id']] = $repos) : ($repo_db[] = $repos);
- variable_set('apk_repositories', $repo_db);
- drupal_set_message(t('Repositories are saved'));
- $form_state['redirect'] = 'admin/config/apk_browser/repositories';
- //drupal_set_message(t('Submitting values: @values', array('@values' => var_export($form_state, TRUE))));
-}
-
-function apk_browser_repositories_list() {
- $terms = '';
- $header = array('ID', 'URL', 'Repo', 'Arch', array('data' => 'Manage', 'colspan' => '2'));
- $add = l('<img src="' . base_path() . drupal_get_path('module', 'apk_browser') .
- '/images/add.png" title="Add repo" />', 'admin/config/apk_browser/repositories/add', array('html' => TRUE));
- foreach (variable_get('apk_repositories', array()) as $key => $repo) {
- $edit = l('<img src="' . base_path() . drupal_get_path('module', 'apk_browser') .
- '/images/page_white_edit.png" title="Edit repo" />', 'admin/config/apk_browser/repositories/' . $key . '/edit', array('html' => TRUE));
- $delete = l('<img src="' . base_path() . drupal_get_path('module', 'apk_browser') .
- '/images/delete.png" title="Delete repo" />', 'admin/config/apk_browser/repositories/' . $key . '/delete', array('html' => TRUE));
- $terms = '<table><tr>';
- $terms .= '</tr></table>';
- $tarch = taxonomy_term_load($repo['arch']);
- $trepo = taxonomy_term_load($repo['repo']);
- $rows[] = array($key, $repo['url'], $trepo->name, $tarch->name, $edit, $delete);
- }
- if (!empty($rows)) {
- $output = theme('table', array('header' => $header, 'rows' => $rows));
- $output .= $add;
- return $output;
- } else {
- return t('No repositories added. Please add one.') . ' ' . $add;
- }
-}
-
-function apk_browser_import_apk() {
- $repos = variable_get('apk_repositories', NULL);
- $debug = variable_get('apk_import_debug', '0');
- $updated = array();
- $added = array();
- $skipped = '0';
- foreach ($repos as $repo) {
- $apk_string = file_get_contents($repo['url']);
- //no need to update if apkindex is not changed
- $checksum = md5($apk_string);
- $checksum_db = variable_get('apk_import_checksum', '');
- //print_r($checksum . '<br>' . $checksum_db. '<br>' . variable_get('apk_import_debug', '0'));
- if (($debug == '1') || ($checksum != $checksum_db)) {
- if ($debug == '1') {
- watchdog('apk', 'APK importer running in debug mode!', array(), WATCHDOG_WARNING, NULL);
- }
- $packages = apk_browser_apkindex_reader($apk_string);
- foreach ($packages as $package) {
- $exist = apk_browser_apk_check($package['P'], $repo['arch'], $repo['repo']);
- if ($exist) {
- //check if both fields are set
- if (count($exist) == '2') {
- //if checksum has changed we set nid and update node
- if ($exist['csum'] != $package['C']) {
- $package['update'] = $exist['nid'];
- $updated[] = apk_browser_add_apk($package, $repo['arch'], $repo['repo']);
- //log to db if we are debugging
- if ($debug == '1') {
- watchdog('apk', 'Package @apk updated', array('@apk' => $package['P']), WATCHDOG_INFO, NULL);
- }
- } else {
- if ($debug == '1') {
- watchdog('apk', 'Package @apk already in database', array('@apk' => $package['P']), WATCHDOG_INFO, NULL);
- }
- $skipped++;
- }
- } else {
- watchdog('apk', 'Package @apk has issues', array('@apk' => $package['P']), WATCHDOG_ERROR, NULL);
- }
- // this is a new package
- } else {
- $added[] = apk_browser_add_apk($package, $repo['arch'], $repo['repo']);
- if ($debug == '1') {
- watchdog('apk', 'Package @apk added', array('@apk' => $package['P']), WATCHDOG_INFO, NULL);
- }
- }
- }
- watchdog('apk', 'Added @added and updated @updated and skipped @skipped packages', array('@added' => count($added), '@updated' => count($updated), '@skipped' => $skipped), WATCHDOG_INFO, NULL);
- variable_set('apk_import_checksum', $checksum);
- } else {
- watchdog('apk', 'APK index is up-to-date', array(), WATCHDOG_INFO, NULL);
- }
- }
-}
-
-function apk_browser_add_apk($package, $arch, $repo) {
- /*
- * 1st array key is language, currently set to und
- * second key is for multi value fields like depend
- * php timeout set to 10min for initial repo import
- */
- ini_set('max_execution_time', 600);
- $node = (isset($package['update'])) ? node_load($package['update']) : new stdClass();
- $node->type = 'apk';
- foreach ($package as $field => $value) {
- switch ($field) {
- case 'P':
- $node->title = $value;
- break;
- case 'C':
- $node->apk_checksum['und'][0]['value'] = $value;
- break;
- case 'V':
- $node->apk_version['und'][0]['value'] = $value;
- break;
- case 'S':
- $node->apk_size['und'][0]['value'] = $value;
- break;
- case 'I':
- $node->apk_isize['und'][0]['value'] = $value;
- break;
- case 'T':
- $node->apk_description['und'][0]['value'] = $value;
- break;
- case 'U':
- $node->apk_url['und'][0]['value'] = $value;
- break;
- case 'L':
- $node->apk_license['und'][0]['value'] = $value;
- break;
- //setting this will update package with this nid number
- case 'update':
- $node->revision = '1';
- $node->nid = $value;
- break;
- case 'D':
- foreach ($value as $depend) {
- $node->apk_depends['und'][]['value'] = $depend;
- }
- break;
- }
- }
- $node->taxonomy_apk_repo['und'][0]['tid'] = $repo;
- $node->taxonomy_apk_arch['und'][0]['tid'] = $arch;
- $node = node_submit($node);
- node_save($node);
- return $node->nid;
-}
-
-function apk_browser_apkindex_reader($apk_string) {
- //file_get_contents outputs string and php tar needs file
- $temp = tempnam("/tmp", "apk_");
- $fp = fopen($temp, 'w');
- fwrite($fp, $apk_string);
- fclose($fp);
- $tar_object = new Archive_Tar($temp);
- $apkindex = $tar_object->extractInString("APKINDEX");
- //convert packages data into array
- $packages = preg_split("`\n\W+`", $apkindex);
- //remove last empty line
- array_pop($packages);
- foreach ($packages as $key => $package) {
- //convert packages lines into array
- $apackage = preg_split("`\n`", $package);
- foreach ($apackage as $apk_line) {
- //create apk variables and arrayify if its depend line
- $value = substr($apk_line, 2);
- $apackages[$key][$apk_line[0]] = ($apk_line[0] == 'D') ? explode(" ", $value) : $value;
- }
- }
- unlink($temp);
- return $apackages;
-}
-
-function apk_browser_apk_check($title, $arch, $repo) {
- /* query using 4 tables to fetch nid and checksum
- * used to check if apk exist and return checksum
- * to check if its updated
- */
- return db_query("
- SELECT node.nid,
- csum.apk_checksum_value as csum
- FROM {node},
- {field_data_taxonomy_apk_arch} AS arch,
- {field_data_taxonomy_apk_repo} AS repo,
- {field_data_apk_checksum} AS csum
- WHERE node.nid = arch.entity_id
- AND node.nid = repo.entity_id
- AND node.nid = csum.entity_id
- AND node.title = :title
- AND arch.taxonomy_apk_arch_tid = :arch
- AND repo.taxonomy_apk_repo_tid = :repo", array(
- ':title' => $title,
- ':arch' => $arch,
- ':repo' => $repo
- )
- )->fetchAssoc();
-}
-
-function apk_browser_views_api() {
- return array('api' => 3.0);
+<?php + +function apk_browser_menu() { + //Menu item to test new functions. + $items['apk_browser'] = array( + 'title' => 'Import APK', + 'description' => 'Import APK packages', + 'page callback' => 'apk_browser_import_apk', + 'access arguments' => array('access apk browser'), + ); + $items['admin/config/apk_browser'] = array( + 'title' => 'Package browser', + 'description' => 'Configure package browser', + 'page callback' => 'system_admin_menu_block_page', + 'access arguments' => array('access apk browser'), + //system_admin_menu_block_page needs admin inc + 'file' => 'system.admin.inc', + 'file path' => drupal_get_path('module', 'system'), + ); + $items['admin/config/apk_browser/settings'] = array( + 'title' => 'Settings', + 'description' => 'Configure global APK browser settings', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('apk_browser_settings'), + 'access arguments' => array('access apk browser'), + ); + $items['admin/config/apk_browser/repositories'] = array( + 'title' => 'Repositories', + 'description' => 'Configure APK repositories', + 'page callback' => 'apk_browser_repositories_list', + 'access arguments' => array('access apk browser'), + ); + $items['admin/config/apk_browser/repositories/add'] = array( + 'title' => 'Add repository', + 'description' => 'Add repositoriy', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('apk_browser_repository_edit_form'), + 'access arguments' => array('access apk browser'), + ); + $items['admin/config/apk_browser/repositories/%/edit'] = array( + 'title' => 'Edit repository', + 'description' => 'Edit repositoriy', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('apk_browser_repository_edit_form', 4), + 'access arguments' => array('access apk browser'), + 'access callback' => TRUE, + ); + $items['admin/config/apk_browser/repositories/%/delete'] = array( + 'title' => 'Delete repository', + 'description' => 'Delete repositoriy', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('apk_browser_repository_delete_form', 4), + 'access arguments' => array('access apk browser'), + 'access callback' => TRUE, + ); + return $items; +} + +function apk_browser_permission() { + return array( + 'access apk browser' => array( + 'title' => t('Access APK browser'), + 'description' => t('Access permissions for APK browser'), + ), + ); +} + +function apk_browser_settings($form) { + $form['settings'] = array( + '#type' => 'fieldset', + '#title' => t('APK browser settings'), + ); + $form['settings']['apk_import_debug'] = array( + '#type' => 'checkbox', + '#title' => t('Import debugging'), + '#description' => t('Write import debugging to watchdog'), + '#default_value' => variable_get('apk_import_debug', '0') + ); + return system_settings_form($form); +} + +function apk_browser_repository_delete_form($form, &$form_state, $rid) { + $repos = variable_get('apk_repositories', array()); + if (array_key_exists($rid, $repos)) { + $form['repo_id'] = array('#type' => 'hidden', '#value' => $rid); + return confirm_form($form, t('Are you sure you want to delete repository with ID @ID?', array('@ID' => $rid)), 'admin/config/apk_browser/repositories', t('This action cannot be undone.'), t('Delete repository'), t('Cancel')); + } else { + drupal_set_message(t('Please select an existing repository ID'), 'error'); + drupal_goto('admin/config/apk_browser/repositories'); + } +} + +function apk_browser_repository_delete_form_submit($form, &$form_state) { + $repos = variable_get('apk_repositories', array()); + unset($repos[$form_state['values']['repo_id']]); + variable_set('apk_repositories', array_values($repos)); + drupal_set_message(t('Repository deleted')); + $form_state['redirect'] = 'admin/config/apk_browser/repositories'; +} + +function apk_browser_repository_edit_form($form, &$form_state, $rid = array()) { + $repos = variable_get('apk_repositories', array()); + if (is_string($rid)) { + $form['repo_id'] = array('#type' => 'hidden', '#value' => $rid); + if (!array_key_exists($rid, $repos)) { + drupal_set_message(t('Please select an existing repository ID'), 'error'); + drupal_goto('admin/config/apk_browser/repositories'); + } + } + $repo = taxonomy_vocabulary_machine_name_load('apk_repo'); + $repo_tree = taxonomy_get_tree($repo->vid); + $arch = taxonomy_vocabulary_machine_name_load('apk_arch'); + $arch_tree = taxonomy_get_tree($arch->vid); + if (empty($arch_tree) || empty($repo_tree)) { + $form['warning'] = array( + '#type' => 'item', + '#markup' => '<p>Please add terms to you your repositories and architectures</p>' + . l('Manage Taxonomy', 'admin/structure/taxonomy') + ); + } else { + $form['settings'] = array( + '#type' => 'fieldset', + '#title' => t('Repository settings'), + ); + $form['settings']['apk_repo_url'] = array( + '#type' => 'textfield', + '#title' => t('Repository URL'), + '#size' => '100', + '#default_value' => is_string($rid) ? $repos[$rid]['url'] : '', + '#description' => t('Link to the APKINDEX.tar.gz file inside the repository'), + '#required' => TRUE, + ); + foreach ($repo_tree as $key => $term) { + $repo_options[$term->tid] = $term->name; + } + //generate a form item to select terms + $form['settings']['repo'] = array( + '#type' => 'select', + '#options' => $repo_options, + '#title' => 'Select repository', + '#default_value' => is_string($rid) ? $repos[$rid]['repo'] : '', + '#description' => t('Please make sure you select the correct repository. + Preventing to do so will break package listing') + ); + foreach ($arch_tree as $key => $term) { + $arch_options[$term->tid] = $term->name; + } + $form['settings']['arch'] = array( + '#type' => 'select', + '#options' => $arch_options, + '#default_value' => is_string($rid) ? $repos[$rid]['arch'] : '', + '#title' => 'Select architecture', + '#description' => t('Please make sure you select the correct architecture. + Preventing to dox so will break package listing') + ); + $form['submit'] = array( + '#type' => 'submit', + '#value' => t('Save repository') + ); + } + return $form; +} + +function apk_browser_repository_edit_form_validate($form, &$form_state) { + if (!valid_url($form_state['values']['apk_repo_url'], TRUE)) { + form_set_error('apk_repo_url', t('Please specify a valid URL!')); + } + //foreach (variable_get('apk_repositories', array()) as $repo) { + // if ($form_state['values']['apk_repo_url'] == $repo['url']) { + // form_set_error('apk_repo_url', t('You are trying to add a double url')); + // } + // } +} + +function apk_browser_repository_edit_form_submit($form, &$form_state) { + $repos = array( + 'url' => $form_state['values']['apk_repo_url'], + 'arch' => $form_state['values']['arch'], + 'repo' => $form_state['values']['repo'] + ); + $repo_db = variable_get('apk_repositories', array()); + isset($form_state['values']['repo_id']) ? ( $repo_db[$form_state['values']['repo_id']] = $repos) : ($repo_db[] = $repos); + variable_set('apk_repositories', $repo_db); + drupal_set_message(t('Repositories are saved')); + $form_state['redirect'] = 'admin/config/apk_browser/repositories'; + //drupal_set_message(t('Submitting values: @values', array('@values' => var_export($form_state, TRUE)))); +} + +function apk_browser_repositories_list() { + $terms = ''; + $header = array('ID', 'URL', 'Repo', 'Arch', array('data' => 'Manage', 'colspan' => '2')); + $add = l('<img src="' . base_path() . drupal_get_path('module', 'apk_browser') . + '/images/add.png" title="Add repo" />', 'admin/config/apk_browser/repositories/add', array('html' => TRUE)); + foreach (variable_get('apk_repositories', array()) as $key => $repo) { + $edit = l('<img src="' . base_path() . drupal_get_path('module', 'apk_browser') . + '/images/page_white_edit.png" title="Edit repo" />', 'admin/config/apk_browser/repositories/' . $key . '/edit', array('html' => TRUE)); + $delete = l('<img src="' . base_path() . drupal_get_path('module', 'apk_browser') . + '/images/delete.png" title="Delete repo" />', 'admin/config/apk_browser/repositories/' . $key . '/delete', array('html' => TRUE)); + $terms = '<table><tr>'; + $terms .= '</tr></table>'; + $tarch = taxonomy_term_load($repo['arch']); + $trepo = taxonomy_term_load($repo['repo']); + $rows[] = array($key, $repo['url'], $trepo->name, $tarch->name, $edit, $delete); + } + if (!empty($rows)) { + $output = theme('table', array('header' => $header, 'rows' => $rows)); + $output .= $add; + return $output; + } else { + return t('No repositories added. Please add one.') . ' ' . $add; + } +} + +function apk_browser_import_apk() { + $repos = variable_get('apk_repositories', NULL); + $debug = variable_get('apk_import_debug', '0'); + $updated = array(); + $added = array(); + $skipped = '0'; + foreach ($repos as $repo) { + $apk_string = file_get_contents($repo['url']); + //no need to update if apkindex is not changed + $checksum = md5($apk_string); + $checksum_db = variable_get('apk_import_checksum', ''); + //print_r($checksum . '<br>' . $checksum_db. '<br>' . variable_get('apk_import_debug', '0')); + if (($debug == '1') || ($checksum != $checksum_db)) { + if ($debug == '1') { + watchdog('apk', 'APK importer running in debug mode!', array(), WATCHDOG_WARNING, NULL); + } + $packages = apk_browser_apkindex_reader($apk_string); + foreach ($packages as $package) { + $exist = apk_browser_apk_check($package['P'], $repo['arch'], $repo['repo']); + if ($exist) { + //check if both fields are set + if (count($exist) == '2') { + //if checksum has changed we set nid and update node + if ($exist['csum'] != $package['C']) { + $package['update'] = $exist['nid']; + $updated[] = apk_browser_add_apk($package, $repo['arch'], $repo['repo']); + //log to db if we are debugging + if ($debug == '1') { + watchdog('apk', 'Package @apk updated', array('@apk' => $package['P']), WATCHDOG_INFO, NULL); + } + } else { + if ($debug == '1') { + watchdog('apk', 'Package @apk already in database', array('@apk' => $package['P']), WATCHDOG_INFO, NULL); + } + $skipped++; + } + } else { + watchdog('apk', 'Package @apk has issues', array('@apk' => $package['P']), WATCHDOG_ERROR, NULL); + } + // this is a new package + } else { + $added[] = apk_browser_add_apk($package, $repo['arch'], $repo['repo']); + if ($debug == '1') { + watchdog('apk', 'Package @apk added', array('@apk' => $package['P']), WATCHDOG_INFO, NULL); + } + } + } + watchdog('apk', 'Added @added and updated @updated and skipped @skipped packages', array('@added' => count($added), '@updated' => count($updated), '@skipped' => $skipped), WATCHDOG_INFO, NULL); + variable_set('apk_import_checksum', $checksum); + } else { + watchdog('apk', 'APK index is up-to-date', array(), WATCHDOG_INFO, NULL); + } + } +} + +function apk_browser_add_apk($package, $arch, $repo) { + /* + * 1st array key is language, currently set to und + * second key is for multi value fields like depend + * php timeout set to 10min for initial repo import + */ + ini_set('max_execution_time', 600); + $node = (isset($package['update'])) ? node_load($package['update']) : new stdClass(); + $node->type = 'apk'; + foreach ($package as $field => $value) { + switch ($field) { + case 'P': + $node->title = $value; + break; + case 'C': + $node->apk_checksum['und'][0]['value'] = $value; + break; + case 'V': + $node->apk_version['und'][0]['value'] = $value; + break; + case 'S': + $node->apk_size['und'][0]['value'] = $value; + break; + case 'I': + $node->apk_isize['und'][0]['value'] = $value; + break; + case 'T': + $node->apk_description['und'][0]['value'] = $value; + break; + case 'U': + $node->apk_url['und'][0]['value'] = $value; + break; + case 'L': + $node->apk_license['und'][0]['value'] = $value; + break; + //setting this will update package with this nid number + case 'update': + $node->revision = '1'; + $node->nid = $value; + break; + case 'D': + foreach ($value as $depend) { + $node->apk_depends['und'][]['value'] = $depend; + } + break; + } + } + $node->taxonomy_apk_repo['und'][0]['tid'] = $repo; + $node->taxonomy_apk_arch['und'][0]['tid'] = $arch; + $node = node_submit($node); + node_save($node); + return $node->nid; +} + +function apk_browser_apkindex_reader($apk_string) { + //file_get_contents outputs string and php tar needs file + $temp = tempnam("/tmp", "apk_"); + $fp = fopen($temp, 'w'); + fwrite($fp, $apk_string); + fclose($fp); + $tar_object = new Archive_Tar($temp); + $apkindex = $tar_object->extractInString("APKINDEX"); + //convert packages data into array + $packages = preg_split("`\n\W+`", $apkindex); + //remove last empty line + array_pop($packages); + foreach ($packages as $key => $package) { + //convert packages lines into array + $apackage = preg_split("`\n`", $package); + foreach ($apackage as $apk_line) { + //create apk variables and arrayify if its depend line + $value = substr($apk_line, 2); + $apackages[$key][$apk_line[0]] = ($apk_line[0] == 'D') ? explode(" ", $value) : $value; + } + } + unlink($temp); + return $apackages; +} + +function apk_browser_apk_check($title, $arch, $repo) { + /* query using 4 tables to fetch nid and checksum + * used to check if apk exist and return checksum + * to check if its updated + */ + return db_query(" + SELECT node.nid, + csum.apk_checksum_value as csum + FROM {node}, + {field_data_taxonomy_apk_arch} AS arch, + {field_data_taxonomy_apk_repo} AS repo, + {field_data_apk_checksum} AS csum + WHERE node.nid = arch.entity_id + AND node.nid = repo.entity_id + AND node.nid = csum.entity_id + AND node.title = :title + AND arch.taxonomy_apk_arch_tid = :arch + AND repo.taxonomy_apk_repo_tid = :repo", array( + ':title' => $title, + ':arch' => $arch, + ':repo' => $repo + ) + )->fetchAssoc(); +} + +function apk_browser_views_api() { + return array('api' => 3.0); }
\ No newline at end of file |